/**
 * PM-Admin 日历页面tip提示插件的JavaScript实现
 * 专门用于 block-calendar 日历框的tooltip功能
 */

(function($) {
    'use strict';

    /**
     * 初始化日历页面的tooltip功能
     * @param {string} container - 容器选择器，默认为.block-calendar
     */
    function setupCalendarTooltips(container) {
        var $container = $(container || '.block-calendar');
        
        // 为所有包含tooltip类的元素设置鼠标事件
        $container.find('.tooltip').each(function() {
            var $tooltip = $(this);
            var $tip = $tooltip.find('.tip');
            
            if ($tip.length === 0) return;
            
            // 鼠标悬停时显示tooltip
            $tooltip.hover(
                function() {
                    showTooltip($tooltip, $tip);
                },
                function() {
                    hideTooltip($tip);
                }
            );
            
            // 点击时隐藏tooltip
            $tooltip.on('click', function(e) {
                if (!$tip.is(':visible')) {
                    showTooltip($tooltip, $tip);
                    e.stopPropagation();
                } else {
                    hideTooltip($tip);
                }
            });
            
            // 点击页面其他地方时隐藏tooltip
            $(document).on('click', function(e) {
                if (!$tooltip.is(e.target) && $tooltip.has(e.target).length === 0) {
                    hideTooltip($tip);
                }
            });
        });
    }
    
    /**
     * 显示tooltip
     * @param {jQuery} $tooltip - tooltip容器元素
     * @param {jQuery} $tip - tip内容元素
     */
    function showTooltip($tooltip, $tip) {
        // 先隐藏所有其他tooltip
        hideAllTooltips();
        
        // 计算位置
        var tooltipOffset = $tooltip.offset();
        var tooltipWidth = $tooltip.outerWidth();
        var tooltipHeight = $tooltip.outerHeight();
        
        // 获取窗口尺寸
        var windowWidth = $(window).width();
        var windowHeight = $(window).height();
        
        // 计算tooltip显示位置
        var tipTop = tooltipOffset.top + 14;
        var tipLeft = tooltipOffset.left + 10;
        
        
        // 设置tip位置
        $tip.css({
            'position': 'absolute',
            'top': tipTop,
            'left': tipLeft,
            'z-index': 1000,
            'display': 'block',
            'background': '#ffffff',
            'border': '1px solid #d0d7de',
            'border-radius': '3px',
            'padding': '8px',
            'box-shadow': '0 1px 2px rgba(0,0,0,0.05)',
            'max-width': '400px',
            'min-width': '250px'
        });
        
        // 添加显示动画
        $tip.stop().fadeIn(200);
    }
    
    /**
     * 隐藏tooltip
     * @param {jQuery} $tip - tip内容元素
     */
    function hideTooltip($tip) {
        $tip.stop().fadeOut(200);
    }
    
    /**
     * 隐藏所有tooltip
     */
    function hideAllTooltips() {
        $('.tip:visible').stop().fadeOut(200);
    }
    
    /**
     * 移除tooltip功能
     * @param {string} container - 容器选择器
     */
    function removeCalendarTooltips(container) {
        var $container = $(container || '.block-calendar');
        
        $container.find('.tooltip').off('hover click');
        $(document).off('click', hideAllTooltips);
        hideAllTooltips();
    }
    
    /**
     * 动态创建issue的tooltip内容（与Thymeleaf模板保持一致）
     * @param {Object} issue - 问题对象
     * @returns {string} - tooltip的HTML内容
     */
    function createIssueTooltipContent(issue) {
        var content = '';
        
        // 问题链接（与Thymeleaf模板格式一致）
        content += '<a class="issue overdue behind-schedule" href="' + (issue.url || '/issues/' + issue.id) + '">' + 
                  (issue.trackerName || '') + ' #' + (issue.id || '') + '</a>: ' + 
                  (issue.subject || '') + '<br><br>';
        
        // 项目信息
        if (issue.projectName) {
            content += '<strong>项目</strong>: ' + issue.projectName + '<br>';
        }
        
        // 状态信息
        if (issue.statusName) {
            content += '<strong>状态</strong>: ' + issue.statusName + '<br>';
        }
        
        // 开始日期
        if (issue.startDate) {
            content += '<strong>开始日期</strong>: ' + formatDate(issue.startDate) + '<br>';
        }
        
        // 计划完成日期
        if (issue.dueDate) {
            content += '<strong>计划完成日期</strong>: ' + formatDate(issue.dueDate) + '<br>';
        }
        
        // 指派给
        if (issue.assignedToName) {
            content += '<strong>指派给</strong>: ' + issue.assignedToName + '<br>';
        }
        
        // 优先级
        if (issue.priorityName) {
            content += '<strong>优先级</strong>: ' + issue.priorityName;
        }
        
        return content;
    }
    
    /**
     * 格式化日期
     * @param {string|Date} date - 日期
     * @returns {string} - 格式化后的日期
     */
    function formatDate(date) {
        if (!date) return '';
        
        var d = new Date(date);
        if (isNaN(d.getTime())) return date;
        
        return d.getFullYear() + '-' + 
               String(d.getMonth() + 1).padStart(2, '0') + '-' + 
               String(d.getDate()).padStart(2, '0');
    }
    
    /**
     * 动态添加issue的tooltip到日历
     * @param {string} date - 日期字符串（格式：YYYY-MM-DD）
     * @param {Object} issue - 问题对象
     * @param {Object} options - 配置选项
     */
    function addIssueToCalendar(date, issue, options) {
        var $calendar = $('.block-calendar .cal');
        var $dateCell = $calendar.find('.calbody').filter(function() {
            var dayNum = $(this).find('.day-num').text().trim();
            return dayNum === date.split('-')[2]; // 匹配日期
        }).first();
        
        if ($dateCell.length === 0) return;
        
        var defaults = {
            cssClasses: '',
            starting: false,
            ending: false
        };
        
        var settings = $.extend({}, defaults, options);
        
        // 构建CSS类
        var cssClasses = ['issue', 'tooltip', 'hascontextmenu'];
        if (settings.cssClasses) {
            cssClasses = cssClasses.concat(settings.cssClasses.split(' '));
        }
        if (settings.starting) cssClasses.push('starting');
        if (settings.ending) cssClasses.push('ending');
        
        // 状态和优先级类
        if (issue.trackerId) cssClasses.push('tracker-' + issue.trackerId);
        if (issue.statusId) cssClasses.push('status-' + issue.statusId);
        if (issue.priorityId) cssClasses.push('priority-' + issue.priorityId);
        
        // 创建tooltip容器
        var tooltipHtml = '<div class="' + cssClasses.join(' ') + '" data-issue-id="' + (issue.id || '') + '">' +
            (issue.projectName || '') + ' - ' +
            '<a class="issue overdue behind-schedule" href="' + (issue.url || '/issues/' + issue.id) + '">' +
            (issue.trackerName || '') + ' #' + (issue.id || '') + '</a>: ' + (issue.subject || '') +
            '<span class="tip" style="display: none;">' + createIssueTooltipContent(issue) + '</span>' +
            '<input type="checkbox" name="ids[]" value="' + (issue.id || '') + '" style="display:none;">' +
            '</div>';
        
        $dateCell.append(tooltipHtml);
        
        // 重新初始化tooltip
        setupCalendarTooltips('.block-calendar');
    }
    
    /**
     * 清除日历中的所有issue
     */
    function clearCalendarIssues() {
        $('.block-calendar .cal .calbody .issue').remove();
    }
    
    /**
     * 批量添加issues到日历
     * @param {Array} issuesData - issues数据数组
     */
    function addIssuesToCalendar(issuesData) {
        clearCalendarIssues();
        
        issuesData.forEach(function(issue) {
            if (issue.startDate) {
                addIssueToCalendar(issue.startDate, issue, {
                    starting: true
                });
            }
            if (issue.dueDate && issue.dueDate !== issue.startDate) {
                addIssueToCalendar(issue.dueDate, issue, {
                    ending: true
                });
            }
        });
    }
    
    /**
     * 从服务器加载issues数据并更新日历
     * @param {string} url - API地址
     * @param {Object} params - 请求参数
     */
    function loadIssuesFromServer(url, params) {
        $.ajax({
            url: url,
            type: 'GET',
            data: params,
            success: function(response) {
                if (response.code === 0 && response.data) {
                    addIssuesToCalendar(response.data);
                } else {
                    console.error('加载issues数据失败:', response.msg);
                }
            },
            error: function(xhr, status, error) {
                console.error('加载issues数据出错:', error);
            }
        });
    }
    
    // 全局函数导出
    window.CalendarTooltip = {
        setup: setupCalendarTooltips,
        remove: removeCalendarTooltips,
        addIssue: addIssueToCalendar,
        addIssues: addIssuesToCalendar,
        clear: clearCalendarIssues,
        loadFromServer: loadIssuesFromServer,
        createContent: createIssueTooltipContent,
        hideAll: hideAllTooltips
    };
    
    // 页面加载完成后自动初始化
    $(document).ready(function() {
        setupCalendarTooltips();
        
        // 为指派人筛选添加事件
        $('#assigneeFilter').on('change', function() {
            var assigneeId = $(this).val();
            
            // 这里可以添加筛选逻辑
            console.log('筛选指派人:', assigneeId);
            
            // 示例：重新加载issues数据
            // loadIssuesFromServer('/api/issues', {assigneeId: assigneeId});
        });
    });
    
})(jQuery);

/**
 * 使用示例:
 * 
 * 1. 基本使用（自动初始化）:
 *    // 页面加载后自动生效
 * 
 * 2. 手动初始化:
 *    CalendarTooltip.setup('.block-calendar');
 * 
 * 3. 动态添加单个issue:
 *    var issue = {
 *        id: 123,
 *        trackerName: 'Bug',
 *        subject: '测试问题',
 *        projectName: '项目A',
 *        statusName: '新建',
 *        startDate: '2024-01-01',
 *        dueDate: '2024-01-10',
 *        assignedToName: '张三',
 *        priorityName: '高',
 *        trackerId: 1,
 *        statusId: 1,
 *        priorityId: 3
 *    };
 *    CalendarTooltip.addIssue('2024-01-01', issue, {
 *        starting: true
 *    });
 * 
 * 4. 批量添加issues:
 *    var issues = [
 *        {id: 123, subject: '问题1', startDate: '2024-01-01', dueDate: '2024-01-05'},
 *        {id: 124, subject: '问题2', startDate: '2024-01-03', dueDate: '2024-01-08'}
 *    ];
 *    CalendarTooltip.addIssues(issues);
 * 
 * 5. 从服务器加载数据:
 *    CalendarTooltip.loadFromServer('/api/issues', {month: '2024-01'});
 * 
 * 6. 清除所有issues:
 *    CalendarTooltip.clear();
 * 
 * 7. 移除tooltip功能:
 *    CalendarTooltip.remove();
 */